﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Linq;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using Kaesoft.Hospedaje.Entities;
using Kaesoft.Hospedaje.Proxy;

namespace Kaesoft.Hospedaje.Common
{
    public class VentanaBuscarCatalogosViewModel:ViewModelBase
    {
         private string _tituloVentana;
        private int _totalRegistros;
        private List<CatalogoSummary> _listaCatalogos;
        private List<CatalogoSummary> _tiposConsulta;

        private CatalogoSummary _tipoConsultaSeleccionado;
        private CatalogoSummary _catalogoSeleccionado;
        private string _criterio;

        private RelayCommand _seleccionarCatalogoCommand;
        private RelayCommand _buscarCatalogoCommand;
        private TipoCatalogoNoCache _tipoCatalogo;
        private bool _catalogoMasivo;

        public event EventHandler CerrarVentana;

        public string TituloVentana
        {
            get { return _tituloVentana; }
            set { _tituloVentana = value; OnPropertyChanged("TituloVentana"); }
        }

        public int TotalRegistros
        {
            get { return _totalRegistros; }
            set { _totalRegistros = value; OnPropertyChanged("TotalRegistros"); }
        }

        public List<CatalogoSummary> ListaCatalogos
        {
            get { return _listaCatalogos; }
            set { _listaCatalogos = value; OnPropertyChanged("ListaCatalogos"); }
        }

        public List<CatalogoSummary> TiposConsulta
        {
            get { return _tiposConsulta; }
            set { _tiposConsulta = value; OnPropertyChanged("TiposConsulta"); }
        }

        public CatalogoSummary TipoConsultaSeleccionado
        {
            get { return _tipoConsultaSeleccionado; }
            set { _tipoConsultaSeleccionado = value; OnPropertyChanged("TipoConsultaSeleccionado"); }
        }

        public string Criterio
        {
            get { return _criterio; }
            set { _criterio = value; OnPropertyChanged("Criterio"); }
        }

        public CatalogoSummary CatalogoSeleccionado
        {
            get { return _catalogoSeleccionado; }
            set { _catalogoSeleccionado = value; OnPropertyChanged("CatalogoSeleccionado"); }
        }

        public bool CatalogoMasivo
        {
            get { return _catalogoMasivo; }
            set { if (_catalogoMasivo != value){ _catalogoMasivo = value; OnPropertyChanged("CatalogoMasivo"); } }
        }

        public RelayCommand BuscarCatalogoCommand
        {
            get
            {
                return _buscarCatalogoCommand ?? (_buscarCatalogoCommand = new RelayCommand(BuscarCatalogo));
            }
        }

        public RelayCommand SeleccionarCatalogoCommand
        {
            get
            {
                return _seleccionarCatalogoCommand ?? (_seleccionarCatalogoCommand = new RelayCommand(SeleccionarCatalogo));
            }
        }

        public VentanaBuscarCatalogosViewModel(TipoCatalogoNoCache tipoCatalogo, bool catalogoMasivo)
        {
            CatalogoMasivo = catalogoMasivo;

            _tipoCatalogo = tipoCatalogo;

            switch (tipoCatalogo)
            {
                case TipoCatalogoNoCache.DIAGNOSTICO:
                    TituloVentana = "Buscar Diagnóstico";
                    break;
                case TipoCatalogoNoCache.PROCEDIMIENTO:
                    TituloVentana = "Buscar Procedimiento";
                    break;
                case TipoCatalogoNoCache.ESPECIALIDAD:
                    TituloVentana = "Buscar Especialidad";
                    break;
                default:
                    break;
            }

            InicializarControles();
        }

        public VentanaBuscarCatalogosViewModel(TipoCatalogoNoCache tipoCatalogo)
        {
            CatalogoMasivo = true;

            _tipoCatalogo = tipoCatalogo;

            switch (tipoCatalogo)
            {
                case TipoCatalogoNoCache.DIAGNOSTICO:
                    TituloVentana = "Buscar Diagnóstico";
                    break;
                case TipoCatalogoNoCache.PROCEDIMIENTO:
                    TituloVentana = "Buscar Procedimiento";
                    break;
                case TipoCatalogoNoCache.ESPECIALIDAD:
                    TituloVentana = "Buscar Especialidad";
                    break;
                default:
                    break;
            }

            InicializarControles();
        }

        private void InicializarControles()
        {
            List<CatalogoSummary> lista = new List<CatalogoSummary>();
            lista.Add(new CatalogoSummary() { Codigo = 1, Nombre = "Código" });
            lista.Add(new CatalogoSummary() { Codigo = 2, Nombre = "Nombre" });

            TiposConsulta = lista;
            TipoConsultaSeleccionado = lista.First();
        }

        internal void BuscarCatalogo(object parametro)
        {
            int pagina = Convert.ToInt32(parametro);

            if (pagina == 0)
            {
                OnResetPager("PagerCatalogos");
                TotalRegistros = 0;
            }

            if (!string.IsNullOrEmpty(Criterio) && TipoConsultaSeleccionado.Codigo == 1)
            {
                Procesando = true;
                ProxyParametrizacion.ObtenerCatalogoSummaryPorCriterioAsync((int)_tipoCatalogo, TipoConsultaSeleccionado.Codigo, Criterio ?? "", pagina, ObtenerCatalogoSummaryPorCriterioCompleted);
            }
            else
            {
                if (TipoConsultaSeleccionado.Codigo == 2)
                {
                    Procesando = true;
                    ProxyParametrizacion.ObtenerCatalogoSummaryPorCriterioAsync((int)_tipoCatalogo, TipoConsultaSeleccionado.Codigo, Criterio ?? "", pagina, ObtenerCatalogoSummaryPorCriterioCompleted);
                }
                else
                {
                    ListaCatalogos = null;
                    TotalRegistros = 0; 
                }
            }
        }

        private void ObtenerCatalogoSummaryPorCriterioCompleted(Proxy.ParametrizacionReference.ObtenerCatalogoSummaryPorCriterioCompletedEventArgs e)
        {
            Procesando = false;

            if (e.Error == null)
            {
                ListaCatalogos = e.Result.Entidades;
                TotalRegistros = e.Result.TotalRegistros;

                if (ListaCatalogos.Count == 1)
                {
                    CatalogoSeleccionado = ListaCatalogos.First();
                    SeleccionarCatalogo(null);
                }
            }
        }

        public void SeleccionarCatalogo(object parametro)
        {
            if (CatalogoSeleccionado == null) return;

            if (CerrarVentana != null)
            {
                CerrarVentana(CatalogoSeleccionado, null);
            }
        }
    }
}
